﻿// constants
var TAILLE_ICONE = 40;
var ROW_NUMBER = 8;	// Số dòng
var COLUMN_NUMBER = 8;	// Số cột
var MATERIAL_NUMBER = 6;	// Số lượng quân cờ khác nhau (độ khó)

// variables
var debug_mode = false;
var hint_mode = false;
var best_score = 0;
var score = 0;
var best_combo = 0;
var combo = 0;
var doigt_init_x = 0;
var doigt_init_y = 0;
var $icone;		// Quân cờ đang được touch
var $binome;
var direction = '';
var is_touching = false;
var deplacement_interdit = false;
var hint_timeout;
var fast_move_timeout;
var fruit_item_list = [];		// List các quân cờ trong bàn cờ
var tmp_item_list = [];			// Bản sao của fruit_item_list, đánh dấu những quân đã bị ăn và chưa bị ăn
var tmp_check_horizontal = [];	// Mảng 2 chiếu chứa giá trị true, false dùng để check quân nào được ăn theo hàng ngang
var tmp_check_vertical = [];	// Mảng 2 chiếu chứa giá trị true, false dùng để check quân nào được ăn theo hàng ngang
var tab_test = [];
var multiplier = 0;

var images = [
  'images/icones/sprite.png',
  'images/picto/fire.gif',
  'images/picto/star.gif',
];

/*
 * #zone_jeu : bàn cờ
 *
 */

$(function () { // DOM ready

  $(window).resize(on_resize);

  $('.icone').live('dragstart', function (e) {
    // prevent image dragging
    e.preventDefault();
  });

  $('#zone_message').live('touchmove mousemove', function (e) {
    // prevent window scrolling
    e.preventDefault();
  });

  // xác định quân cờ có đang đc touch thông qua biến: is_touching
  $('.icone').live('touchstart mousedown', function (e) {
	
	console.log("touch quân cờ");
    if (!is_touching && !deplacement_interdit) {
      dragmove = false;
      $icone = $(this);
      $icone.css('z-index', 20);
      icone_ligne = Number($icone.attr('data-row'));
      icone_col = Number($icone.attr('data-col'));
      if (e.originalEvent.type == 'touchstart') {
        doigt_init_x = e.originalEvent.touches[0].clientX;
        doigt_init_y = e.originalEvent.touches[0].clientY;
      }
      if (e.originalEvent.type == 'mousedown') {
        doigt_init_x = e.originalEvent.clientX;
        doigt_init_y = e.originalEvent.clientY;
      }
      is_touching = true;
    }

  });

  
  // Xác định vị trí của con trỏ chuột
  $('#zone_jeu').live('touchmove mousemove', function (e) {
    // prevent window scrolling
    e.preventDefault();
	
	//console.log("Move vào bàn cờ");
	
    if (is_touching) {

      var distance_x, distance_y;

      if (e.originalEvent.type == 'touchmove') {
        distance_x = e.originalEvent.touches[0].clientX - doigt_init_x;
        distance_y = e.originalEvent.touches[0].clientY - doigt_init_y;
      }
      if (e.originalEvent.type == 'mousemove') {
        distance_x = e.originalEvent.clientX - doigt_init_x;
        distance_y = e.originalEvent.clientY - doigt_init_y;
      }

      if (Math.abs(distance_x) > Math.abs(distance_y)) {
        if (distance_x > TAILLE_ICONE / 2) {
          // right
          if (icone_col < COLUMN_NUMBER - 1) {
            dragmove = true;
            $('.icone').removeClass('click adjacent');
            deplacement(icone_ligne, icone_col, icone_ligne, icone_col + 1);
          }
        }

        if (distance_x < -TAILLE_ICONE / 2) {
          // left
          if (icone_col > 0) {
            dragmove = true;
            $('.icone').removeClass('click adjacent');
            deplacement(icone_ligne, icone_col, icone_ligne, icone_col - 1);
          }
        }
      } else {
        if (distance_y > TAILLE_ICONE / 2) {
          // down
          if (icone_ligne < ROW_NUMBER - 1) {
            dragmove = true;
            $('.icone').removeClass('click adjacent');
            deplacement(icone_ligne, icone_col, icone_ligne + 1, icone_col);
          }
        }

        if (distance_y < -TAILLE_ICONE / 2) {
          // up
          if (icone_ligne > 0) {
            dragmove = true;
            $('.icone').removeClass('click adjacent');
            deplacement(icone_ligne, icone_col, icone_ligne - 1, icone_col);
          }
        }
      }
    }
  });

  
  // Khi nhả chuột
  $('#zone_jeu').live('touchend mouseup', function (e) {
    if (is_touching) {
      is_touching = false;
      $icone.css('z-index', 10);
      if(!dragmove){
        verif_click($icone);
      }
    }
  });

  
  on_resize();

  // wait until every image is loaded to launch the game
  loadimages(images, function () {
    init_game();
  });

});

/*
 * Hiển thị những quân xung quanh có thể move xung quanh quân được click (hoặc move nếu click những quân có thể move)
 */
function verif_click($icone_test) {
	if(!$('.icone.click').length)	// Click lần đầu
	{
		console.log("Click lần đầu");
		
		$icone_test.addClass('click');
		icone_test_ligne = Number($icone_test.attr('data-row'));
		icone_test_col = Number($icone_test.attr('data-col'));
		add_adjacent(icone_test_ligne, icone_test_col);
	} 
	else 	// Click những lần sau
	{
		console.log("Click lần sau");
	
		$icone_ref = $('.icone.click');
		icone_ref_ligne = Number($icone_ref.attr('data-row'));
		icone_ref_col = Number($icone_ref.attr('data-col'));
		icone_test_ligne = Number($icone_test.attr('data-row'));
		icone_test_col = Number($icone_test.attr('data-col'));
		
		// Nếu click những vùng đang chọn, click sẽ move quân cờ
		if ((icone_ref_ligne == icone_test_ligne && icone_ref_col == icone_test_col - 1) ||
		  (icone_ref_ligne == icone_test_ligne && icone_ref_col == icone_test_col + 1) ||
		  (icone_ref_ligne == icone_test_ligne - 1 && icone_ref_col == icone_test_col) ||
		  (icone_ref_ligne == icone_test_ligne + 1 && icone_ref_col == icone_test_col) ) 
		{
			$icone = $icone_ref;
			deplacement(icone_ref_ligne, icone_ref_col, icone_test_ligne, icone_test_col);
			$('.icone').removeClass('click adjacent');
		} 
		else // Click sang những vùng khác, sẽ show những nước đi có thể xung quanh quân được chọn
		{
			$('.icone').removeClass('click adjacent');
			$icone_test.addClass('click');
			add_adjacent(icone_test_ligne, icone_test_col);
		}
	}
};

/*
 * Hiển thị trạng thái là quân có thể move xung quanh quân cờ được click
 */
function add_adjacent(row, column) {
	if (row > 0) {
		$('.icone[data-row=' + (row-1) + '][data-col=' + column + ']').addClass('adjacent');
	}
	
	if (column > 0) {
		$('.icone[data-row=' + row + '][data-col=' + (column-1) + ']').addClass('adjacent');
	}
	
	if (column<COLUMN_NUMBER-1) {
		$('.icone[data-row=' + row + '][data-col=' + (column+1) + ']').addClass('adjacent');
	}
  
	if (row<ROW_NUMBER-1) {
		$('.icone[data-row=' + (row+1) + '][data-col=' + column + ']').addClass('adjacent');
	}
}


function init_game() {
  
  $('#zone_message').html('');

  score = 0;
  combo = 0;
  MATERIAL_NUMBER = 6; // normal : 6

  fruit_item_list = [];
  var rendu_tableau = '';

  clearTimeout(hint_timeout);
  $('.hint').removeClass('hint');
  hint_mode = false;

  on_resize();

  // Tạo RANDOM các quân cờ
  for (var i = 0 ; i < ROW_NUMBER ; i++) {
    fruit_item_list[i] = [];
    for (var j = 0 ; j < COLUMN_NUMBER ; j++) {
      var nb_icon = Math.ceil(Math.random() * MATERIAL_NUMBER);

      if (i > 1) {
        while(fruit_item_list[i-2][j] == nb_icon && fruit_item_list[i-1][j] == nb_icon){
          nb_icon = Math.ceil(Math.random() * MATERIAL_NUMBER);
        }
      }
      if (j > 1) {
        while(fruit_item_list[i][j-2] == nb_icon && fruit_item_list[i][j-1] == nb_icon){
          nb_icon = Math.ceil(Math.random() * MATERIAL_NUMBER);

          if (i > 1) {
            while(fruit_item_list[i-2][j] == nb_icon && fruit_item_list[i-1][j] == nb_icon){
              nb_icon = Math.ceil(Math.random() * MATERIAL_NUMBER);
            }
          }

        }
      }

      fruit_item_list[i][j] = nb_icon;
      rendu_tableau += '<div class="icone icone_' + nb_icon + '" data-row="' + i + '" data-col="' + j + '" data-icone="' + nb_icon + '" style="top: ' + Number(i*TAILLE_ICONE) + 'px; left: ' + Number(j*TAILLE_ICONE) + 'px;"></div>';
    }
    console.log("render full row");
  }  

  // Render những div quân cờ vào id "zone_jeu"
  $('#zone_jeu').html(rendu_tableau);

  /* Hiển thị best score và best combo
  var local_best_score = localStorage.getItem('best_score');
  if (local_best_score != null) {
    best_score = local_best_score;
  }
  $('#best_score_num').html(best_score);

  var local_best_combo = localStorage.getItem('best_combo');
  if (local_best_combo != null) {
    best_combo = local_best_combo;
  }
  $('#best_combo_num').html(best_combo);
*/
  // initial check
  multiplier = 0;
  check_all_item();	// 

  /*
  $('#current_score_num').html(score);
  $('#current_combo_num').html(combo);
*/
  
};

/*
 * Di chuyển quân cờ
 */
function deplacement(row, column, new_row, new_column) {
	console.log("Move (" + row + ", " + column + ") -> (" + new_row + "," + new_column + ")");
	
	is_touching = false;
	deplacement_interdit = true;

	clearTimeout(hint_timeout);
	$('.hint').removeClass('hint');
	hint_mode = false;

	$binome = $('.icone[data-row=' + new_row + '][data-col=' + new_column + ']');

	$icone.css('z-index', 10);

  // icons switch positions

  var row_origin = row;
  var col_origin = column;
  var item_origin = fruit_item_list[row][column];
  var new_row_origin = new_row;
  var new_col_origin = new_column;
  var new_item_origin = fruit_item_list[new_row][new_column];

  $icone.attr('data-row', new_row_origin);
  $icone.attr('data-col', new_col_origin);
  $binome.attr('data-row', row_origin);
  $binome.attr('data-col', col_origin);

  $icone.css({
    'left': new_col_origin*TAILLE_ICONE,
    'top': new_row_origin*TAILLE_ICONE
  });
  $binome.css({
    'left': col_origin*TAILLE_ICONE,
    'top': row_origin*TAILLE_ICONE
  });

  fruit_item_list[row_origin][col_origin] = new_item_origin;
  fruit_item_list[new_row_origin][new_col_origin] = item_origin;

  // after the movement : check for new chains
  setTimeout(function () {
	  console.log("ket qua sau khi di chuyen --> " + check_all_item());
    if (!check_all_item()) {
      // no chain found : back to initial position

      $icone.attr('data-row', row_origin);
      $icone.attr('data-col', col_origin);
      $binome.attr('data-row', new_row_origin);
      $binome.attr('data-col', new_col_origin);

      $icone.css({
        'left': col_origin*TAILLE_ICONE,
        'top': row_origin*TAILLE_ICONE
      });
      $binome.css({
        'left': new_col_origin*TAILLE_ICONE,
        'top': new_row_origin*TAILLE_ICONE
      });

      fruit_item_list[row_origin][col_origin] = item_origin;
      fruit_item_list[new_row_origin][new_col_origin] = new_item_origin;

      setTimeout(function () {
        check_all_item();
      }, 300);
      
    }

    $icone = undefined;
    $binome = undefined;

  }, 300);
};


/*
 * Check tất cả các quân cờ xem có quân nào ăn được hay không. Return true | false
 */
function check_all_item() {
	var result = false;
	
  for (var i = 0; i < ROW_NUMBER; i++) {
    tmp_item_list[i] = [];
    for (var j = 0; j < COLUMN_NUMBER; j++) {
      tmp_item_list[i][j] = false;
    }
  }

  for (var i = 0; i < ROW_NUMBER; i++) {
    tmp_check_horizontal[i] = [];
    for (var j = 0; j < COLUMN_NUMBER; j++) {
      tmp_check_horizontal[i][j] = false;
    }
  }

  for (var i = 0; i < ROW_NUMBER; i++) {
    tmp_check_vertical[i] = [];
    for (var j = 0; j < COLUMN_NUMBER; j++) {
      tmp_check_vertical[i][j] = false;
    }
  }

  $('.icone.hypercube').removeClass('new');

  for (var i = 0; i < ROW_NUMBER; i++) {
    for (var j = 0 ; j < COLUMN_NUMBER; j++) {
      if (check_right_item(i, j)) {
        result = true;
      }
    }
  }

  // check for hypercube move
  /*
  if ($icone != undefined && $binome != undefined) {
    if ($icone.hasClass('hypercube') && !$icone.hasClass('new')) {
      destroy_color($binome.attr('data-icone'), $icone.attr('data-row'), $icone.attr('data-col'));
      tmp_item_list[$icone.attr('data-row')][$icone.attr('data-col')] = true;
      result = true;
      multiplier++;
      if(multiplier > combo){
        combo = multiplier;
        $('#current_combo_num').html(combo);
      }
      $('#zone_message').append('<div class="hypercube">EXCELLENT!</div>');

    }
    if ($binome.hasClass('hypercube') && !$binome.hasClass('new')) {
      destroy_color($icone.attr('data-icone'), $binome.attr('data-row'), $binome.attr('data-col'));
      tmp_item_list[$binome.attr('data-row')][$binome.attr('data-col')] = true;
      result = true;
      multiplier++;
      if(multiplier > combo){
        combo = multiplier;
        $('#current_combo_num').html(combo);
      }
      $('#zone_message').append('<div class="hypercube">EXCELLENT!</div>');
    }
  }
	*/

  if (result) {
	  clearTimeout(fast_move_timeout);

	  // Remove những quân đã bị ăn
	  for (var i = 0; i < ROW_NUMBER; i++) {
		  for (var j = 0 ; j < COLUMN_NUMBER; j++) {
			  if (tmp_item_list[i][j]) {          
				  fruit_item_list[i][j] = 0;
				  $('.icone[data-row=' + i + '][data-col=' + j + ']').fadeOut(300, function () { $(this).remove(); });	// Animation remove quân cờ
				  
				  // Hiển thị điểm được ăn trên đừng con cờ
				  var points = 10 * multiplier;
				  var $aff_score = $('<div class="aff_score" style="left:' + j*TAILLE_ICONE + 'px; top:' + i*TAILLE_ICONE + 'px;">+' + points + '</div>');
				  $('#zone_jeu').append($aff_score);
				  score += points;
			  }          
		  }
    }

    $('#current_score_num').html(score);
    
    setTimeout(function () {
      $aff_score.fadeOut(400, function () { $('.aff_score').remove(); });
      $('#zone_message').html('');
    }, 700);

    setTimeout(function () {
      add_new_item();	// Lấp đầy những quân bị ăn
      setTimeout(function () {
        check_all_item();
      }, 400);
    }, 400);
  } 
  else 
  {
    // no chain found
    if ($icone == undefined && $binome == undefined) {
    	if (test_possible_move()) {
    		deplacement_interdit = false;
        if (score > 1000) {
          // difficulty++
          MATERIAL_NUMBER = 7;
        }
        if (score > 2000) {
          // difficulty++
          MATERIAL_NUMBER = 8;
        }

        // reset multiplier if the player not not find new chain fast
        fast_move_timeout = setTimeout(function () {
          multiplier = 0;
        }, 1500);

        // Display hint after a few seconds
        hint_timeout = setTimeout(function () {
          hint_mode = true;
          test_possible_move();
        }, 7000);
        
      } else {
        
        $('#zone_message').html('<div class="bad">GAME OVER</div>');
        $('#zone_message').append('<div class="good">' + score + ' points</div>');
        if (score > best_score) {
          best_score = score;
          localStorage.setItem('best_score', best_score);
          $('#best_score_num').html(best_score);
        }
        $('#zone_message').append('<div class="good">combo x ' + combo + '</div>');
        if (combo > best_combo) {
          best_combo = combo;
          localStorage.setItem('best_combo', best_combo);
          $('#best_combo_num').html(best_combo);
        }
        $('#zone_message').append('<div class="bt_new_game">Play again</div>');

      }
    }    
  }

  return result;
};

/*
 * Check quân cờ tại vị trí (row, column) xem có ăn được hay không
 * Result :
 * 		- true : nếu ăn được
 * 		- false: nếu không ăn được
 */
function check_right_item(row, column) {
	var result = false;
  
	var current_item_value = fruit_item_list[row][column];
  
	var vertical_item_num = 1;
	var horizontal_item_num = 1;
  
	var i;
  
	// Check dọc xuống
	if (!tmp_check_vertical[row][column]) {
		i = 1;
		while(row + i < COLUMN_NUMBER && fruit_item_list[row+i][column] == current_item_value && !tmp_check_vertical[row+i][column]) {
			vertical_item_num++;
			i++;
		}
    
		if (vertical_item_num >= 3) {	// Nếu ăn theo hàng dọc (quân ăn >= 3)
			result = true;
			multiplier++;
			
			if(multiplier > combo){
				combo = multiplier;
				$('#current_combo_num').html(combo);
			}
      
			if (multiplier > 1) {
				var $aff_combo = $('<div class="aff_combo" style="left:' + (column*TAILLE_ICONE) + 'px; top:' + (row*TAILLE_ICONE) + 'px;">x' + multiplier + '</div>');
				$('#zone_jeu').append($aff_combo);
				$aff_combo.animate(
				{
					top : '-=' + (TAILLE_ICONE/2),
					opacity : 0
				},
				600,
				function(){
					$(this).remove();
				}
				);
			}
	
			tmp_item_list[row][column] = true;
			tmp_check_vertical[row][column] = true;
	      
			// Đánh dấu những quân bị ăn vào mảng tmp_item_list
			i = 1;
			while(row+i < COLUMN_NUMBER && fruit_item_list[row+i][column] == current_item_value) {
				tmp_item_list[row+i][column] = true;
				tmp_check_vertical[row+i][column] = true;
				i++;
			} 
		}
	}


	// Check ngang
	if (!tmp_check_horizontal[row][column]) {
		i = 1;
    
		while(column + i < ROW_NUMBER && fruit_item_list[row][column + i] == current_item_value && !tmp_check_horizontal[row][column + i]) {
			horizontal_item_num++;
			i++;
		}

		if (horizontal_item_num >= 3) {	// Nếu ăn theo hàng ngang (quân ăn >= 3)
			result = true;
			multiplier++;
			if(multiplier > combo){
				combo = multiplier;
				$('#current_combo_num').html(combo);
			}
      
			if (multiplier > 1) {
				var $aff_combo = $('<div class="aff_combo" style="left:' + (column*TAILLE_ICONE) + 'px; top:' + (row*TAILLE_ICONE) + 'px;">x' + multiplier + '</div>');
				$('#zone_jeu').append($aff_combo);
				$aff_combo.animate(
				{
					top : '-=' + (TAILLE_ICONE/2),
					opacity : 0
				},
				600,
				function(){
					$(this).remove();
				}
				);
			}

	      tmp_item_list[row][column] = true;
	      tmp_check_horizontal[row][column] = true;
      
	      // right
	      i = 1;
	      while(column+i < ROW_NUMBER && fruit_item_list[row][column+i] == current_item_value) {
	    	  
	    	  // VH add
	    	  tmp_item_list[row][column+i] = true;
	          tmp_check_horizontal[row][column+i] = true;
	    	  
	          i++;
	      } 
		}
	} 
  
	//VH console.log("check_right_item(" + row + ", " + column + ") => " + result);
	return result;
};

function destroy_color(num_icone, ligne, colonne) {
	console.log("destroy_color --> " + ligne, colonne, num_icone);
  for (var i = 0; i < ROW_NUMBER; i++) {
    for (var j = 0 ; j < COLUMN_NUMBER; j++) {
      if (fruit_item_list[i][j] == num_icone) {
        tmp_item_list[i][j] = true;
        $('.icone[data-row=' + i + '][data-col=' + j + ']').css({
          'left': colonne*TAILLE_ICONE,
          'top': ligne*TAILLE_ICONE
        });
      }
    }
  }
};

/*
 * Tạo ra những quân cờ mới thay thế cho những quân cờ đã bị ăn
 */
function add_new_item() {
  for (var i = ROW_NUMBER-1; i >= 0 ; i--) {
    for (var j = 0 ; j < COLUMN_NUMBER; j++) {

      if (fruit_item_list[i][j] == 0) {
        // look above for an icon to fill the hole
        var k = 1;
        while((i - k) >= 0 && fruit_item_list[i-k][j] == 0) {
          k++;
        }
        

        if ((i - k) < 0) {  // Random quân tại vị trí trống	
          // no icon found above : create random new icon
          var random_icone = Math.ceil(Math.random() * MATERIAL_NUMBER);
          $new_icon = $('<div class="icone icone_' + random_icone + '" data-row="' + i + '" data-col="' + j + '" data-icone="' + random_icone + '"></div>');
          $new_icon.css({
            'left': j*TAILLE_ICONE,
            'top': -TAILLE_ICONE
          });
          $('#zone_jeu').append($new_icon);
          
          $new_icon.animate({	// Animation rớt từ trên xuống ô trống
            'top': i*TAILLE_ICONE
          }, 0);

          
          fruit_item_list[i][j] = random_icone;
        } 
        else 	// Chuyển quân trên xuống quân dưới
        {
          // icon found above : icon falling animation
          var $icone_chute = $('.icone[data-row=' + (i - k) + '][data-col=' + j + ']');
          // update icon properties (correct line and column numbers)
          $icone_chute.attr('data-row', i);
          $icone_chute.css('top', i*TAILLE_ICONE);

          fruit_item_list[i][j] = fruit_item_list[i-k][j];
          fruit_item_list[i-k][j] = 0;

        }
      }
    }
  }
};

function test_possible_move() { // Kiem tra co the di chuyen dc nua hay ko ?
  var move_found = false;
  var hint_displayed = false;
  var nb_possible_moves = 0;

  for (var i = 0; i < ROW_NUMBER; i++) {
    tab_test[i] = [];
    for (var j = 0 ; j < COLUMN_NUMBER; j++) {
      tab_test[i][j] = fruit_item_list[i][j];
    }
  }

  for (var i = 0; i < ROW_NUMBER; i++) {
    for (var j = 0 ; j < COLUMN_NUMBER; j++) {
      // test right move
      if (j < COLUMN_NUMBER-1) {
        tab_test[i][j] = fruit_item_list[i][j+1];
        tab_test[i][j+1] = fruit_item_list[i][j];
        if (test_chain_game_over(i, j)) {
          move_found = true;
          nb_possible_moves++;
          if(debug_mode){
            $('.icone[data-row=' + i + '][data-col=' + (j+1) + ']').addClass('hint');
          }
          if (hint_mode && !hint_displayed) {
            $('.icone[data-row=' + i + '][data-col=' + (j+1) + ']').addClass('hint');
            hint_displayed = true;
          }
        }
        if (test_chain_game_over(i, j+1)) {
          move_found = true;
          nb_possible_moves++;
          if(debug_mode){
            $('.icone[data-row=' + i + '][data-col=' + j + ']').addClass('hint');
          }
          if (hint_mode && !hint_displayed) {
            $('.icone[data-row=' + i + '][data-col=' + j + ']').addClass('hint');
            hint_displayed = true;
          }
        }
        tab_test[i][j] = fruit_item_list[i][j];
        tab_test[i][j+1] = fruit_item_list[i][j+1];
      }

      // test down move
      if (i < ROW_NUMBER-1) {
        tab_test[i][j] = fruit_item_list[i+1][j];
        tab_test[i+1][j] = fruit_item_list[i][j];
        if (test_chain_game_over(i, j)) {
          move_found = true;
          nb_possible_moves++;
          if(debug_mode){
            $('.icone[data-row=' + (i+1) + '][data-col=' + j + ']').addClass('hint');
          }
          if (hint_mode && !hint_displayed) {
            $('.icone[data-row=' + (i+1) + '][data-col=' + j + ']').addClass('hint');
            hint_displayed = true;
          }
        }
        if (test_chain_game_over(i+1, j)) {
          move_found = true;
          nb_possible_moves++;
          if(debug_mode){
            $('.icone[data-row=' + i + '][data-col=' + j + ']').addClass('hint');
          }
          if (hint_mode && !hint_displayed) {
            $('.icone[data-row=' + i + '][data-col=' + j + ']').addClass('hint');
            hint_displayed = true;
          }
        }
        tab_test[i][j] = fruit_item_list[i][j];
        tab_test[i+1][j] = fruit_item_list[i+1][j];
      }
    }
  }

  if(nb_possible_moves <= 3) {
    if(nb_possible_moves <= 1) {
      $('#moves').addClass('critical').html(nb_possible_moves + '<br>move');
    } else {
      $('#moves').removeClass('critical').html(nb_possible_moves + '<br>moves');
    }
  } else {
    $('#moves').removeClass('critical').html('');
  }
  

  return move_found;
};


function test_chain_game_over(ligne, colonne) {
  var result = false;
  var num_icone = tab_test[ligne][colonne];
  var suite_verti = 1;
  var suite_horiz = 1;
  var i;
  // up
  i = 1;
  while(ligne-i >= 0 && tab_test[ligne-i][colonne] == num_icone) {
    suite_verti++;
    i++;
  }
  // down
  i = 1;
  while(ligne+i < COLUMN_NUMBER && tab_test[ligne+i][colonne] == num_icone) {
    suite_verti++;
    i++;
  }
  // left
  i = 1;
  while(colonne-i >= 0 && tab_test[ligne][colonne-i] == num_icone) {
    suite_horiz++;
    i++;
  }
  // right
  i = 1;
  while(colonne+i < ROW_NUMBER && tab_test[ligne][colonne+i] == num_icone) {
    suite_horiz++;
    i++;
  }
  if (suite_verti >= 3) {
    result = true;
  }
  if (suite_horiz >= 3) {
    result = true;
  }
  if (tab_test[ligne][colonne] == 10) {
    // hypercube
    result = true;
  }
  return result;
};

function on_resize() {
  board_size = $('#zone_jeu').width();
  TAILLE_ICONE = board_size/8;

  $('#zone_jeu').css({
    'height': board_size + 'px',
    'background-size': board_size/4 + 'px ' + board_size/4 + 'px'
  });

  for (var i = 0; i < ROW_NUMBER; i++) {
    for (var j = 0 ; j < COLUMN_NUMBER; j++) {
      $('.icone[data-row=' + i + '][data-col=' + j + ']').css({
        'left': j*TAILLE_ICONE + 'px',
        'top': i*TAILLE_ICONE + 'px'
      });
    }
  }

  setTimeout(function () {
    // hide the address bar
    window.scrollTo(0, 1);
  }, 0);

};

/* 
 * Load images
 */
function loadimages(imgArr,callback) {
  //Keep track of the images that are loaded
  var imagesLoaded = 0;
  function _loadAllImages(callback) {
    //Create an temp image and load the url
    var img = new Image();
    $(img).attr('src',imgArr[imagesLoaded]);
    if (img.complete || img.readyState === 4) {
      // image is cached
      imagesLoaded++;
      //Check if all images are loaded
      if (imagesLoaded == imgArr.length) {
        //If all images loaded do the callback
        callback();
      } else {
        //If not all images are loaded call own function again
        _loadAllImages(callback);
      }
    } else {
      $(img).load(function () {
        //Increment the images loaded variable
        imagesLoaded++;
        //Check if all images are loaded
        if (imagesLoaded == imgArr.length) {
          //If all images loaded do the callback
          callback();
        } else {
          //If not all images are loaded call own function again
          _loadAllImages(callback);
        }
      });
    }
  };    
  _loadAllImages(callback);
}
